﻿#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>

/***************11.深⼊理解指针(1)**************/

/*****1. 内存和地址*****/
//地址信息被下达给内存，在内存上，就可以找到
//该地址对应的数据，将数据在通过数据总线传⼊
//CPU内寄存器

/**2. 指针变量和地址**/
//int main()
//{
//	int a = 10; //变量创建的本质其实是，在内存中申请空间，向内存申请4个字节的空间存放10
//
//	printf("%p\n",&a);
//	int* pa = &a;//pa是一个变量，用来存放地址
//	//pa就是指针变量
//	//编号 == 地址 == 指针
//	//pa是用来存放地址(指针)的 == pa是用来存放指针的，所以pa叫指针变量(存放指针的变量)
//	//指针变量就是用来存放地址的
//
//	return 0;
//}

//int main()
//{
//	int a = 10;
//	int* pa = &a;
//
//	*pa = 20;//解引用,* --> 解引用操作符
//	//*pa == a
//	printf("%d\n",a);//20
//	return 0;
//}

/*******指针变量的⼤⼩*********/

//int main()
//{
//	int* pa;
//	printf("%zd\n",sizeof(pa));
//	printf("%zd\n", sizeof(int*));
//	printf("%zd\n", sizeof(char*));
//	printf("%zd\n", sizeof(short*));
//	printf("%zd\n", sizeof(long*));
//	printf("%zd\n", sizeof(long long*));
//	printf("%zd\n", sizeof(float*));
//	printf("%zd\n", sizeof(double*));
//
//	//32位平台下地址是32个bit位，指针变量⼤⼩是4个字节
//	//64位平台下地址是64个bit位，指针变量⼤⼩是8个字节
//	//注意指针变量的⼤⼩和类型是⽆关的，只要指针类型的变量，在相同的平台下，⼤⼩都是相同的
//
//	return 0;
//}

/****指针变量类型的意义****/
//指针的类型决定了，对指针解引⽤的时候有多⼤的权限（⼀次能操作⼏个字节）

//int main()
//{
//	int a = 0x11223344;
//	//int* pa = &a;
//	char* pa = &a;
//
//	*pa = 0;
//
//	return 0;
//}

//***指针+-整数
//指针的类型决定了指针向前或者向后⾛⼀步有多⼤（距离）

//int main()
//{
//	int a = 0x11223344;
//	int* pi = &a;
//	char* pc = &a;
//	printf("%p\n",&a);
//	printf("%p\n", pi);
//	printf("%p\n", pi + 1);
//
//	printf("%p\n", pc);
//	printf("%p\n", pc + 1);
//
//	return 0;
//}

/*******void* 指针*******/

//⼀般void*类型的指针是使⽤在函数参数的部分，⽤来接收不同类型数据的地址，这样的设计可以
//实现泛型编程的效果。使得⼀个函数来处理多种类型的数据
//int main()
//{
//	int a = 10;
//	//int* pa = &a;//int*
//	//char* pc = &a;
//	void* pv2 = &a;
//
//	char ch = 'w';
//	 /*char* pc= &ch;
//	 int* pi = &ch;*/
//	void* pv = &ch;
//
//	//*pv;	void指针不能解引用
//	//pv+1;	void指针也不能做加减操作	
//
//	return 0;
//}

//void test(void* pv)
//{
//	//pv在使用的时候，会强制类型转换，然后去使用
//}
//
//int main()
//{
//	int a = 10;
//	test(&a);
//	char c = 'w';
//	test(&c);
//	double d = 3.14;
//	test(&d);
//
//	return 0;
//}


/*******指针运算******/
//指针的基本运算有三种，分别是：
 
//指针+-整数
//int main()
//{
//	int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };
//	//printf("%d\n",*(p++));
//	int sz = sizeof(arr) / sizeof(arr[0]);
//	int* p = &arr[sz-1];
//	int i = 0;
//
//	for (i = 0; i < sz; i++)
//	{
//		*(p - i) = i+1;
//		
//	}
//
//	//for (i = 0; i < sz; i++)
//	//{
//	//	scanf("%d",p + i);
//	//}
//
//	for (i = 0;i < sz;i++)
//	{
//		/*printf("%d\n",*p);
//		p--;*/
//		printf("%d\n",arr[i]);
//	}
//
//	return 0;
//}


//指针-指针
//指针减指针的时候，两个指针一定是指向同一区域的
//指针减指针得到的值的绝对值，两个指针之间的元素个数
//int main()
//{
//	int arr[10] = { 0 };
//	int n = &arr[9] - &arr[0];
//	printf("%d\n",n);//n等于元素个数
//	return 0;
//}
// 

#include <string.h>
//strlen 是求字符串长度，统计的是字符串\0之前的字符个数
//int main()
//{
//	char arr[] = "abcdef";
//	//数组名其实是数组首元素的地址
//	//arr == &arr[0]
//
//	size_t len = strlen(arr);
//	printf("%zd\n",len);
//	
//	return 0;
//}

//1
//size_t my_strlen(char* str)
//{
//	size_t count = 0;
//	while (*str != '\0')
//	{
//		count++;
//		str++;
//	}
//	return count;
//}

//2
//size_t my_strlen(char* str)
//{
//	char* start = str;
//	while (*str != '\0')
//		str++;
//	return str - start;//指针减指针
//}
//
//int main()
//{
//	char arr[] = "abcdef";
//	//数组名其实是数组首元素的地址
//	//arr == &arr[0]
//
//	size_t len = my_strlen(arr);
//	printf("%zd\n",len);
//	
//	return 0;
//}
//指针的关系运算

//int main()
//{
//	int arr[] = { 1,2,3,4,5,6,7,8,9,10 };
//	int sz = sizeof(arr) / sizeof(arr[0]);
//
//	/*int i = 0;
//	int* p = arr;*/
//	/*for (i = 0;i < sz;i++)
//	{
//		printf("%d\n",*(p+i));
//	}*/
//	
//	int* p = arr;
//	while (p < &arr[sz])
//	{
//		printf("%d\n",*p);
//		p++;
//	}
//
//	return 0;
// }



